package com.mazaiting.rabbitmq.domain.info;

import com.mazaiting.rabbitmq.constant.enums.RabbitExchangeTypeEnum;
import lombok.Data;

import java.util.Map;

/**
 * RabbitMQ 队列和交换机机绑定关系实体对象
 */
@Data
public class RabbitModuleInfo {

    /**
     * 路由Key
     */
    private String routingKey;

    /**
     * 队列信息
     */
    private Queue queue;

    /**
     * 交换机信息
     */
    private Exchange exchange;

    /**
     * 交换机信息类
     */
    @Data
    public static class Exchange {

        /**
         * 交换机类型.
         * 默认直连交换机.
         */
        private RabbitExchangeTypeEnum type = RabbitExchangeTypeEnum.DIRECT;

        /**
         * 交换机名称
         */
        private String name;

        /**
         * 是否持久化.
         * 默认true持久化, 重启消息不会丢失.
         */
        private boolean durable = true;

        /**
         * 当所有队绑定列均不在使用时, 是否自动删除交换机.
         * 默认false, 不自动删除.
         */
        private boolean autoDelete = false;

        /**
         * 交换机其他参数
         */
        private Map<String, Object> arguments;

    }

    /**
     * 队列信息类
     * 延时队列必须配置的属性:
     *  # 死信交换机
     *  dead-letter-exchange: sms.login.delay.exchange
     *  # 死信路由键
     *  dead-letter-routing-key: sms.login.delay.key
     *  # 不自动创建容器-延时队列配置
     *  auto-create-container: false
     */
    @Data
    public static class Queue {

        /**
         * 队列名称
         */
        private String name;

        /**
         * 是否持久化.
         * 默认true持久化, 重启消息不会丢失.
         */
        private boolean durable = true;

        /**
         * 是否具有排他性.
         * 默认false, 可多个消费者消费同一个队列.
         */
        private boolean exclusive = false;

        /**
         * 当消费者均断开连接, 是否自动删除队列.
         * 默认false, 不自动删除, 避免消费者断开队列丢弃消息
         */
        private boolean autoDelete = false;

        /**
         * 是否为延时队列
         */
        private boolean delay = false;

        /**
         * 绑定死信队列的交换机名称
         */
        private String deadLetterExchange;

        /**
         * 绑定死信队列的路由key
         */
        private String deadLetterRoutingKey;

        /**
         * 参数
         */
        private Map<String, Object> arguments;

    }

}
